package com.jtny.nytb.equipment.service;

import com.github.xiaoymin.knife4j.annotations.ApiSort;
import com.jtny.component.entity.PageData;
import com.jtny.component.entity.PageParam;
import com.jtny.component.exception.ServiceException;
import com.jtny.nytb.equipment.dto.rule.*;
import io.swagger.annotations.Api;
import org.springframework.cloud.openfeign.SpringQueryMap;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

/**
 * 设备编号规则Service接口
 *
 * @author 智慧能源中心 - 伍天宇
 * @package com.jtny.nytb.energymonitor.equipment.service
 * @fileName RuleNumberService.java
 * @createTime 2023年09月14日 10:50
 * @Copyright© 2023 jtny
 * 江投能源技术研究院 版权所有
 */
@Api(value = "设备编号规则Service接口", tags = "设备编号规则Service接口")
@ApiSort(202303)
@ResponseBody
public interface CodeRuleService {

    /**
     * 检查字典值
     *
     * @param type         类型
     * @param validDictDTO 有效字典 DTO
     * @return {@link ValidDictDTO}
     */
    @PostMapping("check-dict-value/{type}")
    ValidDictDTO checkDictValue(@PathVariable("type") String type, @RequestBody ValidDictDTO validDictDTO);

    /**
     * 保存 设备编号规则
     *
     * @param codeRuleRequestDTO 设备编号规则请求DTO对象
     * @return {@link Boolean}
     */
    @PostMapping("save/{type}")
    Boolean save(@PathVariable("type") String type, @RequestBody CodeRuleRequestDTO codeRuleRequestDTO) throws ServiceException;

    /**
     * 更新 设备编号规则
     *
     * @param codeRuleRequestDTO 设备编号规则请求DTO对象
     * @return {@link Boolean}
     */
    @PutMapping("update/{type}")
    Boolean update(@PathVariable("type") String type, @RequestBody CodeRuleRequestDTO codeRuleRequestDTO) throws ServiceException;

    /**
     * 根据id查询 设备编号规则
     *
     * @param id 设备编号规则id
     * @return {@link CodeRuleResponseDTO}
     */
    @GetMapping("{type}/{id}")
    CodeRuleResponseDTO getById(@PathVariable("type") String type, @PathVariable(value = "id") Long id) throws ServiceException;

    /**
     * 删除 设备编号规则
     *
     * @param id 设备编号规则id
     * @return {@link Boolean}
     */
    @DeleteMapping("delete/{type}/{id}")
    Boolean delete(@PathVariable("type") String type, @PathVariable(value = "id") Long id) throws ServiceException;

    /**
     * 分页查询 设备编号规则
     *
     * @param levelId   级别标识
     * @param pageParam 页面参数
     * @return {@link PageData}<{@link CodeRuleResponseDTO}>
     */
    @GetMapping("page/{type}/{levelId}")
    PageData<CodeRuleResponseDTO> page(@PathVariable("type") String type, @PathVariable(value = "levelId") Long levelId, @SpringQueryMap PageParam pageParam) throws ServiceException;


    /**
     * 按名称获取字典规则
     *
     * @param name 名字
     * @return {@link CodeRuleDictDTO}
     */
    @PostMapping("dict-rule-name/{type}")
    CodeRuleDictDTO getDictRuleByName(@PathVariable("type") String type, @RequestBody String name) throws ServiceException;

    /**
     * 按名称映射 Dict 规则
     *
     * @param type     类型
     * @param nameList 名称列表
     * @return {@link Map}<{@link String}, {@link CodeRuleDictDTO}>
     * @throws ServiceException 服务异常
     */
    @PostMapping("map-dict-rule-name/{type}")
    Map<String, CodeRuleDictDTO> mapDictRuleByName(@PathVariable("type") String type, @RequestBody List<String> nameList)
            throws ServiceException;

    /**
     * 按名称列表 获取字典规则
     *
     * @param type                 类型
     * @param codeRuleDictNameList 代码规则字典名称列表
     * @return {@link Map}<{@link String}, {@link CodeRuleDictDTO}>
     * @throws ServiceException 服务异常
     */
    @PostMapping("list-rule-dict-name/{type}")
    Map<String, CodeRuleDictDTO> mapRuleDictNameByNameList(@PathVariable("type") String type, @RequestBody List<String> codeRuleDictNameList) throws ServiceException;

    /**
     * 列表规则字典选择
     *
     * @param codeRuleDictSelectQueryDTO 设备编码规则字典选择查询 DTO
     * @return {@link List}<{@link CodeRuleDictDTO}> 设备编码规则字典选择列表
     */
    @PostMapping("list-rule-dict-select/{type}")
    List<CodeRuleDictDTO> listRuleDictSelect(@PathVariable("type") String type, @RequestBody CodeRuleDictSelectQueryDTO codeRuleDictSelectQueryDTO) throws ServiceException;

    /**
     * 生成设备编号
     *
     * @param codeRuleDictList 设备编号规则字典id集合 可以包含 随机数 （%+位数）或 顺序数（#+位数）
     * @return {@link String}
     */
    @GetMapping("get-code-by-code-rule-id/{type}/{codeRuleDictList}")
    String getCodeByCodeRuleId(@PathVariable("type") String type, @PathVariable("codeRuleDictList") List<String> codeRuleDictList) throws ServiceException;
}
